/**
 * 
 */
package com.rangers.auth.base.db;

import java.io.Serializable;

import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.NoRepositoryBean;

import com.rangers.auth.base.details.BriefUser;

/**
 * 用户repo
 * 
 * @version 1.0
 * @author fuhw
 * @date 2017年8月17日 下午5:50:23
 */

/** 
 * <p>1. Repository 是一个空接口. 即是一个标记接口</p> 
 * <p>2. 若我们定义的接口继承了 Repository, 则该接口会被 IOC 容器识别为一个 Repository Bean.纳入到 IOC 容器中. 进而可以在该接口中定义满足一定规范的方法.  </p> 
 * <p>3. 实际上, 也可以通过 @RepositoryDefinition 注解来替代继承 Repository 接口 在 Repository 子接口中声明方法 </p>
 * <p>4. 不是随便声明的. 而需要符合一定的规范 . 查询方法以 find | read | get 开头 </p>
 * <p>5.涉及条件查询时，条件的属性用条件关键字连接 . 要注意的是：条件属性以首字母大写</p>
 * <p>6.支持属性的级联查询. 若当前类有符合条件的属性, 则优先使用,而不使用级联属性. 若需要使用级联属性, 则属性之间使用 _ 进行连接.</p>
 */
// @RepositoryDefinition(domainClass=Person.class,idClass=Integer.class)  
@SuppressWarnings("rawtypes")
@NoRepositoryBean
public interface UserDbAccess<T extends BriefUser, ID extends Serializable> extends CrudRepository<T, ID>{

	T findOne(ID id);

	T save(T entity);

	void delete(ID id);

	Iterable<T> findAll();

	boolean exists(ID id);

	T findByUsername(String username);
	
	long count();

	boolean existsByUsername(String username);
}
